package poo.biblioteca.controladores;

import biblioteca.entidades.Lector;
import biblioteca.entidades.Prestamo;
import biblioteca.excepciones.ExcepcionDeAplicacion;
import biblioteca.modelos.MdlLectores;
import biblioteca.modelos.MdlLibros;
import biblioteca.modelos.MdlPrestamos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import poo.biblioteca.vistas.FrmPrincipal;
import poo.biblioteca.vistas.lectores.DlgBuscarLector;
import poo.biblioteca.vistas.lectores.TbmLector;
import poo.biblioteca.vistas.libros.DlgBuscarLibro;
import poo.biblioteca.vistas.libros.TbmLibro;
import poo.biblioteca.vistas.prestamos.IfrRegistrarPrestamo;

public class CtrPrestamos {

    private FrmPrincipal principal;
    //Vistas
    //------Prestamos
    private IfrRegistrarPrestamo ifrRegistrarPrestamo = null;
    private DlgBuscarLector dlgBuscarLector = null;
    private DlgBuscarLibro dlgBuscarLibro = null;
    //Modelos
    private MdlPrestamos mdlPrestamos = new MdlPrestamos();
    private MdlLectores mdlLectores = new MdlLectores();
    private MdlLibros mdlLibros = new MdlLibros();

    public CtrPrestamos(FrmPrincipal principal) {
        this.principal = principal;
    }

    public void registrarPrestamo() {
        if (ifrRegistrarPrestamo != null) {
            return;
        }
        ifrRegistrarPrestamo = new IfrRegistrarPrestamo();

        ifrRegistrarPrestamo.getPanel().setFechaPrestamo(new Date());

        ifrRegistrarPrestamo.getPanel().btnBuscarLibroAddActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dlgBuscarLibro = new DlgBuscarLibro(principal, true);
                dlgBuscarLibro.setLocationRelativeTo(ifrRegistrarPrestamo);

                dlgBuscarLibro.tblResultadosAddMouseListener(
                        new MouseAdapter() {

                            @Override
                            public void mouseClicked(MouseEvent e) {
                                super.mouseClicked(e);
                                if (e.getClickCount() == 2) {
                                    ifrRegistrarPrestamo.getPanel().setLibro(
                                            dlgBuscarLibro.getLibroSeleccionado());
                                    try {
                                        ifrRegistrarPrestamo.getPanel().setEjemplares(
                                                mdlLibros.buscarEjemplaresDisponiblesParaLibro(
                                                dlgBuscarLibro.getLibroSeleccionado()));
                                    } catch (ExcepcionDeAplicacion ex) {
                                        ifrRegistrarPrestamo.mostrarMensajeError(ex.getMessage(), "Error de Aplicación");
                                        ifrRegistrarPrestamo.setVisible(false);
                                        ifrRegistrarPrestamo = null;
                                    }

                                    dlgBuscarLibro.setVisible(false);
                                    dlgBuscarLibro = null;
                                }
                            }
                        });

                dlgBuscarLibro.btnBuscarAddActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            dlgBuscarLibro.setTableModel(
                                    new TbmLibro(
                                    mdlLibros.buscarLibro(null, dlgBuscarLibro.getTituloLibro(), null, null)));
                        } catch (ExcepcionDeAplicacion ex) {

                            
                            ifrRegistrarPrestamo.mostrarMensajeError(ex.getMessage(), "Error de Aplicación");
                            

                        }
                    }
                });

                dlgBuscarLibro.setVisible(true);

            }
        });

        ifrRegistrarPrestamo.getPanel().btnBuscarLectorAddActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dlgBuscarLector = new DlgBuscarLector(principal, true);
                dlgBuscarLector.setLocationRelativeTo(ifrRegistrarPrestamo);

                dlgBuscarLector.tblResultadosAddMouseListener(
                        new MouseAdapter() {

                            @Override
                            public void mouseClicked(MouseEvent e) {
                                super.mouseClicked(e);
                                if (e.getClickCount() == 2) {
                                    Lector lectorSeleccionado = dlgBuscarLector.getLectorSeleccionado();
                                    ifrRegistrarPrestamo.getPanel().setLector(
                                            lectorSeleccionado);

                                    ifrRegistrarPrestamo.setFechaDeDevolucionAPartirDeNumeroDiasPrestamo(
                                            lectorSeleccionado.getTipoLector().getNumeroDiasPrestamo());
                                    ifrRegistrarPrestamo.setFechaPrestamoEnabled(false);

                                    dlgBuscarLector.setVisible(false);
                                    dlgBuscarLector = null;
                                }
                            }
                        });

                dlgBuscarLector.btnBuscarAddActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            dlgBuscarLector.setTableModel(
                                    new TbmLector(
                                    mdlLectores.buscarLectoresHabilitadosPorApellido(dlgBuscarLector.getApellidos())));
                        } catch (ExcepcionDeAplicacion ex) {
                            
                            ifrRegistrarPrestamo.mostrarMensajeError(ex.getMessage(), "Error de Aplicación");

                        }
                    }
                });

                dlgBuscarLector.setVisible(true);

            }
        });

        
        ifrRegistrarPrestamo.btnOkAddActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Date fechaPrestamo = ifrRegistrarPrestamo.getPanel().getFechaPrestamo();
                Date fechaProgramadaDevolucion = ifrRegistrarPrestamo.getPanel().getFechaProgramadaDevolucion();
                
                Prestamo nuevoPrestamo = new Prestamo(-1,
                        fechaPrestamo,
                        fechaProgramadaDevolucion,
                        null, 
                        ifrRegistrarPrestamo.getPanel().getEjemplar(), 
                        ifrRegistrarPrestamo.getPanel().getLector());
                try {
                    mdlPrestamos.registrarPrestamo (nuevoPrestamo);
                    ifrRegistrarPrestamo.mostrarMensajeInformativo("Se registró correctamente el préstamo","Registro exitoso");
                    
                } catch (ExcepcionDeAplicacion ex) {
                    ifrRegistrarPrestamo.mostrarMensajeError(ex.getMessage(), "Error de Aplicación");
                } finally {
                    ifrRegistrarPrestamo.setVisible(false);
                    ifrRegistrarPrestamo = null;
                }
                
            }
        });
        
        ifrRegistrarPrestamo.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarPrestamo.setVisible(false);
                        ifrRegistrarPrestamo = null;
                    }
                });


        ifrRegistrarPrestamo.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarPrestamo = null;
            }
        });

        principal.addComponenteADesktop(ifrRegistrarPrestamo);
        ifrRegistrarPrestamo.setVisible(true);
    }
}
